package com.bn.Sample5_1;

import android.opengl.Matrix;

//存储系统矩阵状态的类
//用于封装Matrix类各项功能以简化开发的工具类
//
public class MatrixState
{
	private static float[] mProjMatrix = new float[16];//4x4矩阵 投影用
	private static float[] mVMatrix = new float[16];//摄像机位置朝向9参数矩阵
	private static float[] mMVPMatrix;//最后起作用的总变换矩阵

	/**
	 * 设置摄像机
	 * 根据接收的摄像机9个相关参数生成摄像机观察矩阵，并将矩阵元素依次存放到mVMatrix成员数组中
	 */
	public static void setCamera
	(
			float cx,	//摄像机位置x
			float cy,   //摄像机位置y
			float cz,   //摄像机位置z
			float tx,   //摄像机目标点x
			float ty,   //摄像机目标点y
			float tz,   //摄像机目标点z
			float upx,  //摄像机UP向量X分量
			float upy,  //摄像机UP向量Y分量
			float upz   //摄像机UP向量Z分量
	)
	{
		Matrix.setLookAtM
				(
						mVMatrix,
						0,
						cx,
						cy,
						cz,
						tx,
						ty,
						tz,
						upx,
						upy,
						upz
				);
	}

	/**
	 * 设置正交投影参数
	 * 根据接收的正交投影6个相关参数生成正交投影矩阵，
	 * 并将矩阵元素依次存放到mProjMatrix成员数组中
     */
	public static void setProjectOrtho
	(
			float left,		//near面的left
			float right,    //near面的right
			float bottom,   //near面的bottom
			float top,      //near面的top
			float near,		//near面距离
			float far       //far面距离
	)
	{
		Matrix.orthoM(mProjMatrix, 0, left, right, bottom, top, near, far);
	}

	/**
	 * 获取具体物体的总变换矩阵，生成物体总变换矩阵
	 * “变换矩阵”是指用来完成3D场景中物体的平移、旋转、缩放等变换的矩阵
	 */
	public static float[] getFinalMatrix(float[] spec)
	{
		//创建用来存放最终变换矩阵的数组
		mMVPMatrix=new float[16];
		//将摄像机矩阵乘以变换矩阵
		Matrix.multiplyMM(mMVPMatrix, 0, mVMatrix, 0, spec, 0);
		//将投影矩阵乘以上一步的结果矩阵得到最终变换矩阵
		Matrix.multiplyMM(mMVPMatrix, 0, mProjMatrix, 0, mMVPMatrix, 0);
		return mMVPMatrix;
	}
}
